// const getArray = <T>(value: T, times: number): T[] => {
//   return new Array(times).fill(value)
// }

// T 泛型变量一般是大写字母

// console.log(getArray<number>(123, 4).map((item) => item.toFixed()));

// const getArray = <T, U>(param1: T, param2: U, times: number): Array<[T, U]> => {
//   return new Array(times).fill([param1, param2])
// }

// getArray<number, string>(1, 'a', 3).forEach((item: any) => {
//   console.log(item[0]);
//   console.log(item[1]);  
// })

// type GetArray = <T>(arg: T, times: number) => T[]
// let getArray: GetArray = (arg, times) => {
//   return new Array(times).fill(arg)
// }

// interface GetArray{
//   <T>(arg: T, times: number): T[]
// }

// interface GetArray<T>{
//   (arg: T, times: number): T[]
// }

// 以下是泛型继承
interface ValueWithLength {
  length: number
}
const getArray = <T extends ValueWithLength>(arg: T, times: number): T[] => {
  return new Array(times).fill(arg)
}

// <T, K extends keyof T> K是T的属性

const getProps = <T, K extends keyof T> (object: T, propName: K) => {
  return object[propName]
}

const objs = {
  a: 'a',
  b: 'b',
}

getProps(objs, 'a')
getProps(objs, 'b')
